What is json-schema-to-typescript?
The json-schema-to-typescript npm package is a tool that converts JSON Schema definitions into TypeScript interfaces. This is particularly useful for ensuring type safety in TypeScript projects by generating types directly from JSON Schema, which can help in maintaining consistency between your data models and TypeScript types.
What are json-schema-to-typescript's main functionalities?
Convert JSON Schema to TypeScript Interface
This feature allows you to convert a JSON Schema into a TypeScript interface. The `compile` function takes a JSON Schema and a name for the resulting TypeScript interface, and returns a promise that resolves to the TypeScript code as a string.
const { compile } = require('json-schema-to-typescript');
const schema = {
title: 'Example Schema',
type: 'object',
properties: {
name: { type: 'string' },
age: { type: 'number' }
},
required: ['name', 'age']
};
compile(schema, 'ExampleSchema')
.then(ts => console.log(ts));
Generate TypeScript Definitions from Multiple Schemas
This feature allows you to generate TypeScript definitions from a JSON Schema file. The `compileFromFile` function reads a JSON Schema from a file and returns a promise that resolves to the TypeScript code as a string.
const { compileFromFile } = require('json-schema-to-typescript');
compileFromFile('path/to/schema.json')
.then(ts => console.log(ts));
Customizing Output
This feature allows you to customize the output of the TypeScript definitions. The `compile` function accepts an options object where you can specify various settings like adding a banner comment to the generated TypeScript code.
const { compile } = require('json-schema-to-typescript');
const schema = {
title: 'Example Schema',
type: 'object',
properties: {
name: { type: 'string' },
age: { type: 'number' }
},
required: ['name', 'age']
};
const options = {
bannerComment: '/* This is a generated file */'
};
compile(schema, 'ExampleSchema', options)
.then(ts => console.log(ts));
Other packages similar to json-schema-to-typescript
typescript-json-schema
The typescript-json-schema package generates JSON Schema from your TypeScript types. It works in the opposite direction compared to json-schema-to-typescript, making it useful for projects where you start with TypeScript types and need to generate JSON Schema for validation or documentation purposes.
quicktype
The quicktype package can generate TypeScript types from JSON Schema, JSON data, and other sources. It supports multiple languages and is highly configurable, making it a versatile tool for generating types from various data formats.
json-schema-to-flow-type
The json-schema-to-flow-type package converts JSON Schema to Flow types. While it serves a similar purpose to json-schema-to-typescript, it is specifically designed for projects using Flow instead of TypeScript.
json-schema-to-typescript
Compile json schema to typescript typings
Example
Input:
{
"title": "Example Schema",
"type": "object",
"properties": {
"firstName": {
"type": "string"
},
"lastName": {
"type": "string"
},
"age": {
"description": "Age in years",
"type": "integer",
"minimum": 0
},
"hairColor": {
"enum": ["black", "brown", "blue"],
"type": "string"
}
},
"additionalProperties": false,
"required": ["firstName", "lastName"]
}
Output:
export interface ExampleSchema {
firstName: string;
lastName: string;
age?: number;
hairColor?: "black" | "brown" | "blue";
}
Installation
yarn add json-schema-to-typescript
npm install json-schema-to-typescript --save
Usage
import { compile, compileFromFile } from 'json-schema-to-typescript'
compileFromFile('foo.json')
.then(ts => fs.writeFileSync('foo.d.ts', ts))
let mySchema = {
properties: [...]
}
compile(mySchema, 'MySchema')
.then(ts => ...)
See server demo and browser demo for full examples.
Options
compileFromFile
and compile
accept options as their last argument (all keys are optional):
key | type | default | description |
---|
bannerComment | string | "/* tslint:disable */\n/**\n* This file was automatically generated by json-schema-to-typescript.\n* DO NOT MODIFY IT BY HAND. Instead, modify the source JSONSchema file,\n* and run json-schema-to-typescript to regenerate this file.\n*/" | Disclaimer comment prepended to the top of each generated file |
cwd | string | process.cwd() | Root directory for resolving $ref s |
declareExternallyReferenced | boolean | true | Declare external schemas referenced via $ref ? |
enableConstEnums | boolean | true | Prepend enums with const ? |
ignoreMinAndMaxItems | boolean | false | Ignore maxItems and minItems for array types, preventing tuples being generated. |
style | object | { bracketSpacing: false, printWidth: 120, semi: true, singleQuote: false, tabWidth: 2, trailingComma: 'none', useTabs: false } | A Prettier configuration |
unknownAny | boolean | true | Use unknown instead of any where possible |
unreachableDefinitions | boolean | false | Generates code for definitions that aren't referenced by the schema. |
strictIndexSignatures | boolean | false | Append all index signatures with | undefined so that they are strictly typed. |
$refOptions | object | {} | $RefParser Options, used when resolving $ref s |
CLI
A CLI utility is provided with this package.
cat foo.json | json2ts > foo.d.ts
json2ts foo.json > foo.d.ts
json2ts foo.json foo.d.ts
json2ts --input foo.json --output foo.d.ts
json2ts -i foo.json -o foo.d.ts
json2ts -i schemas/**/*.json
json2ts -i schemas/ -o types/
You can pass any of the options described above (including style options) as CLI flags. Boolean values can be set to false using the no-
prefix.
json2ts -i foo.json -o foo.d.ts --unreachableDefinitions
json2ts -i foo.json -o foo.d.ts --style.singleQuote --no-style.semi
Tests
npm test
Features
Custom schema properties:
tsType
: Overrides the type that's generated from the schema. Useful for forcing a type to any
or when using non-standard JSON schema extensions (eg).tsEnumNames
: Overrides the names used for the elements in an enum. Can also be used to create string enums (eg).
Not expressible in TypeScript:
Further Reading
Who uses JSON-Schema-to-TypeScript?